# -*- coding: utf-8 -*-
from dateutil.relativedelta import relativedelta
import datetime


def nuovo_test_personale():
    categorie_test = db(db.categorie_test.id>0).select(orderby=(db.categorie_test.categoria_test))
    return locals()


def invio_test_personale():
    if not checkUserValidity():
        session.flash = T("Completa il tuo profilo per partecipare alle sfide.")
        redirect(URL("default", "profile"))
    else:
        test = db.test(int(request.vars.test_id))
        user = db.auth_user(auth.user_id)
        valutazione_test = getValutazioneTest(test.id)
        form = SQLFORM.factory(Field('video', 'string', label='Link video*', requires=IS_URL()),
                               Field('risultato', 'string', required=True, label='Risultato*'),
                               Field('peso', 'integer', default=user.peso, required=True, label=T("Peso*")),
                               Field('articolo', 'text', widget=advanced_editor, label=T("Articolo")))
        if form.accepts(request.vars, session):
            sfida_id = db.sfide.insert(**{"test_id":test.id, "stato_sfida_id":getStatoSfidaAccettata().id, "auth_user_id":[auth.user_id]})
            insert_dict = db.candidatura._filter_fields(form.vars)
            insert_dict["sfida_id"] = sfida_id
            insert_dict["auth_user_id"] = auth.user_id
            insert_dict["stato_candidatura_id"] = getStatoCandidaturaAttesa().id
            insert_dict["data_ora"] = datetime.datetime.now()
            insert_dict["age"] = relativedelta(insert_dict["data_ora"], db.auth_user(auth.user_id).data_nascita).years                        
            candidatura_id = db.candidatura.insert(**insert_dict)        
            # Invio messaggio ad amministratori
            messaggio_id = db.messaggi.insert(**{"auth_user_id": auth.user_id,
                                                 "soggetto":"Inserita nuova candidatura",
                                                 "corpo":"<html>E' stata inserita una nuova candidatura per il test %s da %s %s.<br />Premi <a href=%s>quì</a> per approvarla.</html>"%(test.test,
                                                                                                                                                                                        user.first_name,
                                                                                                                                                                                        user.last_name,
                                                                                                                                                                                        URL("sfide", "approva_candidatura", vars={"candidatura_id":candidatura_id}))})
            group_id = db(db.auth_group.role=="Administrator").select().first().id
            for row in db((db.auth_user.id==db.auth_membership.user_id)&(db.auth_membership.group_id==group_id)).select(db.auth_user.id):
                db.messaggio_destinatari.insert(**{"auth_user_id":row.id, "messaggio_id":messaggio_id, "is_letto":False})
            session.flash = T("Candidatura inviata, in attesa di approvazione.")
            redirect(URL('default', 'home'))
    return locals()

@auth.requires_membership('Administrator')
def approva_candidatura():
    db.candidatura.id.writable = db.candidatura.id.readable = False
    db.candidatura.age.writable = db.candidatura.age.readable = False    
    candidatura_id = int(request.vars.candidatura_id)
    candidatura = db.candidatura(candidatura_id)
    risultato = getRisultato(candidatura_id) 
    if candidatura.stato_candidatura_id!=getStatoCandidaturaAttesa().id:
        session.flash = T("Candidatura già approvata!")
        redirect(URL("default", "home"))
    form = SQLFORM.factory(Field('stato_candidatura_id','reference stati_candidatura', label='Stato', default=candidatura.stato_candidatura_id, requires=IS_IN_DB(db, 'stati_candidatura.id', '%(stato_candidatura)s')),
                           Field('video', 'string', label='Link video*', requires=IS_URL(), default=candidatura.video),
                           Field('risultato', 'integer', required=True, label='Risultato*', default=candidatura.risultato),
                           Field('peso', 'integer', required=True, label=T("Peso*"), default=candidatura.peso),
                           Field('articolo', 'text', widget=advanced_editor, label=T("Articolo"), default=candidatura.articolo))
    if form.accepts(request.vars, session):
        data_ora = datetime.datetime.now()
        insert_dict = db.candidatura._filter_fields(form.vars)
        insert_dict["data_ora_approvazione"] = data_ora
        db(db.candidatura.id==candidatura_id).update(**insert_dict)
        if int(insert_dict["stato_candidatura_id"])==getStatoCandidaturaApprovata().id:
            test = db.test(db.sfide(candidatura.sfida_id).test_id)
            messaggio_id = db.messaggi.insert(**{"auth_user_id": auth.user_id,
                                                 "soggetto":"Candidatura approvata",
                                                 "corpo":"<html>La tua candidatura per il test %s è stata approvata.</html>"%(test.test)})
            db.messaggio_destinatari.insert(**{"auth_user_id":candidatura.auth_user_id, "messaggio_id":messaggio_id, "is_letto":False})
            # Inserire punteggio
            risultato = getRisultato(candidatura_id)
            punteggio = getPuntiSfida(risultato.ordine)
            db.punteggi.insert(**{"candidatura_id":candidatura_id,
                                  "auth_user_id": candidatura.auth_user_id,
                                  "test_id":test.id,
                                  "data_ora": data_ora,
                                  "categoria_test_id": test.categoria_test_id,
                                  "livello_id":risultato.id,                                  
                                  "risultato":form.vars.risultato,
                                  "punteggio":punteggio})
            # Inserire post
            message = "<html>Ho combattuto nell'arena sfidando me stesso nel test %s.<br />Con un punteggio di %s mi sono classificato al livello <b>%s</b> %s ed ho conquistato %s punti.</html>"%(test.test,
                                                                                                                                                                                                    form.vars.risultato,
                                                                                                                                                                                                    risultato.ordine,
                                                                                                                                                                                                    risultato.livello,
                                                                                                                                                                                                    punteggio)
            db.posts.insert(**{"posted_by": candidatura.auth_user_id,
                               "posted_to": candidatura.auth_user_id,
                               "corpo": message})
            session.flash = T("Candidatura approvata!")
            redirect(URL("default", "home"))
        elif int(insert_dict["stato_candidatura_id"])==getStatoCandidaturaRifiutata().id:
            messaggio_id = db.messaggi.insert(**{"auth_user_id": auth.user_id,
                                                 "soggetto":"Candidatura rifiutata",
                                                 "corpo":"<html>La tua candidatura per il test %s è stata rifiutata.</html>"%(db.test(db.sfida(candidatura.sfida_id).test_id).test)})
            db.messaggio_destinatari.insert(**{"auth_user_id":candidatura.auth_user_id, "messaggio_id":messaggio_id, "is_letto":False})
            session.flash = T("Candidatura rifiutata!")
            redirect(URL("default", "home"))
    return locals()


def lancio_sfida():    
    categorie_test = db(db.categorie_test.id>0).select(orderby=(db.categorie_test.categoria_test))
    return locals()


def invio_sfida():
    test = db.test(int(request.vars.test_id))
    user = db.auth_user(auth.user_id)
    valutazione_test = getValutazioneTest(test.id)
    query = (db.auth_user.id.belongs(getUserFriends()))
    form = SQLFORM.factory(Field("auth_user_id", "reference auth_user", label=T("Sfidante"), requires=IS_IN_DB(db(query), 'auth_user.id', '%(first_name)s %(last_name)s')),
                           Field('video', 'string', label='Link video*', requires=IS_URL()),
                           Field('risultato', 'integer', required=True, label='Risultato*'),
                           Field('peso', 'integer', default=user.peso, required=True, label=T("Peso*")),
                           Field('articolo', 'text', widget=advanced_editor, label=T("Articolo")))
    if form.accepts(request.vars, session):
        partecipanti_sfida = [auth.user_id, form.vars.auth_user_id]
        sfida_id = db.sfide.insert(**{"test_id":test.id, "stato_sfida_id":getStatoSfidaAccettata().id, "auth_user_id":partecipanti_sfida})
        insert_dict = db.candidatura._filter_fields(form.vars)
        insert_dict["sfida_id"] = sfida_id
        insert_dict["auth_user_id"] = auth.user_id
        insert_dict["stato_candidatura_id"] = getStatoCandidaturaAttesa().id
        insert_dict["data_ora"] = datetime.datetime.now()
        insert_dict["age"] = relativedelta(insert_dict["data_ora"], db.auth_user(auth.user_id).data_nascita).years
        candidatura_id = db.candidatura.insert(**insert_dict)
        # Invio messaggio a sfidante
        test = db.test(db.sfide(insert_dict["sfida_id"]).test_id)        
        risultato = getRisultato(candidatura_id)  
        punteggio = getPuntiSfida(risultato.ordine)
        message = "<html>"\
                  "Gladiatore, sfidami nell'arena nel test %s.<br/>"\
                  "Ecco il mio <a href='%s'>test</a>, se validato avrò ottenuto un punteggio di %s classificandomi al livello <b>%s</b> %s conquistando %s punti.<br/>"\
                  "Dimostrami se sai fare di meglio!"\
                  "</html>"%(test.test,
                             form.vars.video,
                             form.vars.risultato,
                             risultato.ordine,
                             risultato.livello,
                             punteggio)
        messaggio_id = db.messaggi.insert(**{"auth_user_id": auth.user_id,
                                             "soggetto":"Lancio sfida",
                                             "corpo":message})
        db.messaggio_destinatari.insert(**{"auth_user_id":form.vars.auth_user_id, "messaggio_id":messaggio_id, "is_letto":False})
        # Invio messaggio ad amministratori
        messaggio_id = db.messaggi.insert(**{"auth_user_id": auth.user_id,
                                             "soggetto":"Inserita nuova candidatura",
                                             "corpo":"<html>E' stata inserita una nuova candidatura per il test %s da %s %s.<br />Premi <a href=%s>quì</a> per approvarla.</html>"%(test.test,
                                                                                                                                                                                    user.first_name,
                                                                                                                                                                                    user.last_name,
                                                                                                                                                                                    URL("sfide", "approva_candidatura", vars={"candidatura_id":candidatura_id}))})
        group_id = db(db.auth_group.role=="Administrator").select().first().id
        for row in db((db.auth_user.id==db.auth_membership.user_id)&(db.auth_membership.group_id==group_id)).select(db.auth_user.id):
            db.messaggio_destinatari.insert(**{"auth_user_id":row.id, "messaggio_id":messaggio_id, "is_letto":False})
        session.flash = T("Candidatura inviata, in attesa di approvazione.")
        redirect(URL('default', 'home'))
    return locals()


def sfide_aperte():
    left = [db.stati_sfida.on(db.sfide.stato_sfida_id==db.stati_sfida.id),
            db.test.on(db.sfide.test_id==db.test.id)]
    query = ((db.sfide.auth_user_id.contains(auth.user_id))&
             (db.stati_sfida.is_chiusa==None))
    rows = db(query).select(db.sfide.ALL,
                            db.test.ALL,
                            left=left)
    return locals()


def visualizza_candidatura():
    db.candidatura.articolo.readable = db.candidatura.articolo.writable = False 
    candidatura_id = int(request.vars.candidatura_id)
    candidatura = db.candidatura(candidatura_id)
    form_candidatura = crud.read(db.candidatura, candidatura)
    form_articolo = SQLFORM.factory(Field('articolo', 'text', widget=advanced_editor, label=T("Articolo"), default=candidatura.articolo))
    if form_articolo.accepts(request.vars, session):
        insert_dict = db.candidatura._filter_fields(form_articolo.vars)
        db(db.candidatura.id==candidatura_id).update(**insert_dict)
        session.flash = T("Articolo aggiornato.")
        redirect(URL('default', 'home'))
    return locals()

def invia_candidatura():
    sfida = db.sfide(int(request.vars.sfida_id))    
    test = db.test(sfida.test_id)
    user = db.auth_user(auth.user_id)
    valutazione_test = getValutazioneTest(test.id)
    valutazione_test = getValutazioneTest(test.id)
    form = SQLFORM.factory(Field('video', 'string', label='Link video*', requires=IS_URL()),
                           Field('risultato', 'string', required=True, label='Risultato*'),
                           Field('peso', 'integer', default=user.peso, required=True, label=T("Peso*")),
                           Field('articolo', 'text', widget=advanced_editor, label=T("Articolo")))
    if form.accepts(request.vars, session):
        sfida_id = sfida.id
        insert_dict = db.candidatura._filter_fields(form.vars)
        insert_dict["sfida_id"] = sfida_id
        insert_dict["auth_user_id"] = auth.user_id
        insert_dict["stato_candidatura_id"] = getStatoCandidaturaAttesa().id
        insert_dict["data_ora"] = datetime.datetime.now()
        insert_dict["age"] = relativedelta(insert_dict["data_ora"], db.auth_user(auth.user_id).data_nascita).years
        candidatura_id = db.candidatura.insert(**insert_dict)
        # Invio messaggio sfidante
        risultato = getRisultato(candidatura_id)  
        punteggio = getPuntiSfida(risultato.ordine)
        message = "<html>"\
                  "Gladiatore, ti ho sfidato nell'arena nel test %s.<br/>"\
                  "Ecco il mio <a href='%s'>test</a>, se validato avrò ottenuto un punteggio di %s classificandomi al livello <b>%s</b> %s conquistando %s punti.<br/>"\
                  "</html>"%(test.test,
                             form.vars.video,
                             form.vars.risultato,
                             risultato.ordine,
                             risultato.livello,
                             punteggio)
        messaggio_id = db.messaggi.insert(**{"auth_user_id": auth.user_id,
                                             "soggetto":"Partecipazione sfida",
                                             "corpo":message})
        destinatari = sfida.auth_user_id
        destinatari.remove(auth.user_id)
        for destinatario in destinatari:
            db.messaggio_destinatari.insert(**{"auth_user_id":destinatario, "messaggio_id":messaggio_id, "is_letto":False})
        # Invio messaggio ad amministratori
        messaggio_id = db.messaggi.insert(**{"auth_user_id": auth.user_id,
                                             "soggetto":"Inserita nuova candidatura",
                                             "corpo":"<html>E' stata inserita una nuova candidatura per il test %s da %s %s.<br />Premi <a href=%s>quì</a> per approvarla.</html>"%(test.test,
                                                                                                                                                                                    user.first_name,
                                                                                                                                                                                    user.last_name,
                                                                                                                                                                                    URL("sfide", "approva_candidatura", vars={"candidatura_id":candidatura_id}))})
        group_id = db(db.auth_group.role=="Administrator").select().first().id
        for row in db((db.auth_user.id==db.auth_membership.user_id)&(db.auth_membership.group_id==group_id)).select(db.auth_user.id):
            db.messaggio_destinatari.insert(**{"auth_user_id":row.id, "messaggio_id":messaggio_id, "is_letto":False})
        session.flash = T("Candidatura inviata, in attesa di approvazione.")
        redirect(URL('default', 'home'))
    return locals()


def rifiutaSfida():
    sfida_id = int(request.vars.sfida_id)
    db(db.sfide.id==sfida_id).update(stato_sfida_id=getStatoSfidaRifiutata().id)
    """
    message = "<html>"\
              "Gladiatore, ti ho sfidato nell'arena nel test %s.<br/>"\
              "Ecco il mio <a href='%s'>test</a>, se validato avrò ottenuto un punteggio di %s classificandomi al livello <b>%s</b> %s conquistando %s punti.<br/>"\
              "</html>"%(test.test,
                         form.vars.video,
                         form.vars.risultato,
                         risultato.ordine,
                         risultato.livello,
                         punteggio)
    messaggio_id = db.messaggi.insert(**{"auth_user_id": auth.user_id,
                                         "soggetto":"Sfida rifiutata",
                                         "corpo":message})
    db.messaggio_destinatari.insert(**{"auth_user_id":form.vars.auth_user_id, "messaggio_id":messaggio_id, "is_letto":False})
                                         
                                         
    """    
    return

